import { TerminalApi } from 'vue-web-terminal'
import { ResultType } from '@xtail/result'

export class TerminalApiPushMsg {
  private terminalApi: typeof TerminalApi

  constructor(terminalApi: typeof TerminalApi) {
    this.terminalApi = terminalApi
  }

  /**
   * 向 Terminal 推送一条成功消息
   *
   * @param {string} name Terminal 名称
   * @param {string} message 消息内容
   * @param {string} tag 消息标签(Terminal 显示推送消息前的标签内容)，默认为 'success'
   */
  success(name: string, message: string, tag: string = 'success') {
    this.terminalApi.pushMessage(name, { type: 'normal', class: 'success', tag, content: message })
  }

  /**
   * 向 Terminal 推送一条错误消息
   *
   * @param {string} name Terminal 名称
   * @param {string} message 消息内容
   * @param {string} tag 消息标签(Terminal 显示推送消息前的标签内容)，默认为 'error'
   */
  error(name: string, message: string, tag: string = 'error') {
    this.terminalApi.pushMessage(name, { type: 'normal', class: 'error', tag, content: message })
  }

  /**
   * 向 Terminal 推送一条警告消息
   *
   * @param {string} name Terminal 名称
   * @param {string} message 消息内容
   * @param {string} tag 消息标签(Terminal 显示推送消息前的标签内容)，默认为 'warning'
   */
  warning(name: string, message: string, tag: string = 'warning') {
    this.terminalApi.pushMessage(name, { type: 'normal', class: 'warning', tag, content: message })
  }

  /**
   * 向 Terminal 推送一条提示消息
   *
   * @param {string} name Terminal 名称
   * @param {string} message 消息内容
   * @param {string} tag 消息标签(Terminal 显示推送消息前的标签内容)，默认为 'info'
   */
  info(name: string, message: string, tag: string = 'info') {
    this.terminalApi.pushMessage(name, { type: 'normal', class: 'info', tag, content: message })
  }

  /**
   * 向 Terminal 推送一条系统消息
   *
   * @param {string} name Terminal 名称
   * @param {string} message 消息内容
   * @param {string} tag 消息标签(Terminal 显示推送消息前的标签内容)，默认为'system'
   */
  system(name: string, message: string, tag: string = 'system') {
    this.terminalApi.pushMessage(name, { type: 'normal', class: 'system', tag, content: message })
  }

  /**
   * 根据 {@link ResultType} 结果对象向 Terminal 推送一条消息
   *
   * @param {string} name Terminal 名称
   * @param {ResultType} result {@link ResultType} 结果对象
   * @param {{data?: boolean, dataPreHandler?: (data: any) => any, successTag?: string, errorTag?: string}} options 配置选项：
   * - data: 是否向 Terminal 推送结果对象中 data 字段数据，默认为 true
   * - dataPreHandler: 预处理结果对象中 data 字段数据的处理函数，默认为直接返回 data，即不做任何处理
   * - successTag: 成功消息的标签，默认为 'success'
   * - errorTag: 错误消息的标签，默认为 'error'
   */
  byResult(
    name: string,
    result: ResultType,
    options?: {
      data?: boolean
      dataPreHandler?: (data: any) => any
      successTag?: string
      errorTag?: string
    }
  ) {
    const {
      data: isData,
      dataPreHandler,
      successTag,
      errorTag
    } = {
      data: true,
      dataPreHandler: (data: any) => data,
      successTag: 'success',
      errorTag: 'error',
      ...options
    }
    if (result.status) {
      if (result.message) this.success(name, result.message, successTag)
      if (isData && result.data) this.success(name, dataPreHandler(result.data), successTag)
    } else {
      if (result.message) this.error(name, result.message, errorTag)
      if (isData && result.data) this.error(name, dataPreHandler(result.data), errorTag)
    }
  }
}
